package edu.sdjzu.exam.service.exam;

import edu.sdjzu.exam.dto.GradingDTO;
import edu.sdjzu.exam.service.exam.AutoGradingService.AutoGradingResult;
import java.math.BigDecimal;
import java.util.List;

/**
 * 批改服务接口
 */
public interface GradingService {
    
    /**
     * 获取需要批改的考试列表
     * @return 考试列表
     */
    List<GradingDTO.ExamGradingListDTO> getExamsNeedingGrading();
    
    /**
     * 获取指定考试的考生批改列表
     * @param examId 考试ID
     * @return 考生列表
     */
    List<GradingDTO.StudentGradingListDTO> getStudentsForGrading(Long examId);
    
    /**
     * 获取学生的所有主观题答案
     * @param examId 考试ID
     * @param studentId 学生ID
     * @return 主观题答案列表
     */
    List<GradingDTO.SubjectiveAnswerDTO> getSubjectiveAnswers(Long examId, Long studentId);
    
    /**
     * 批改单个答案
     * @param gradingDTO 批改数据
     */
    void gradeSingleAnswer(GradingDTO gradingDTO);
    
    /**
     * 批量批改学生的主观题
     * @param batchGradingDTO 批量批改数据
     */
    void batchGradeStudent(GradingDTO.BatchGradingDTO batchGradingDTO);
    
    /**
     * 完成学生批改（计算总分并更新状态）
     * @param examId 考试ID
     * @param studentId 学生ID
     * @return 总分信息
     */
    GradingResult completeStudentGrading(Long examId, Long studentId);
    
    /**
     * 触发自动批卷
     * @param examId 考试ID
     * @param studentId 学生ID
     * @return 自动批卷结果
     */
    AutoGradingResult triggerAutoGrading(Long examId, Long studentId);
    
    /**
     * 获取学生的所有主观题答案（通过sessionId）
     * @param sessionId 考试会话ID
     * @return 主观题答案列表
     */
    List<GradingDTO.SubjectiveAnswerDTO> getSubjectiveAnswersBySession(Long sessionId);
    
    /**
     * 完成学生批改（通过sessionId计算总分并更新状态）
     * @param sessionId 考试会话ID
     * @return 总分信息
     */
    GradingResult completeStudentGradingBySession(Long sessionId);
    
    /**
     * 触发自动批卷（通过sessionId）
     * @param sessionId 考试会话ID
     * @return 自动批卷结果
     */
    AutoGradingResult triggerAutoGradingBySession(Long sessionId);
    
    /**
     * 批改结果
     */
    class GradingResult {
        private BigDecimal totalScore;
        private BigDecimal maxScore;
        private int totalQuestions;
        private int gradedQuestions;
        private String gradeStatus;
        
        // getters and setters
        public BigDecimal getTotalScore() { return totalScore; }
        public void setTotalScore(BigDecimal totalScore) { this.totalScore = totalScore; }
        
        public BigDecimal getMaxScore() { return maxScore; }
        public void setMaxScore(BigDecimal maxScore) { this.maxScore = maxScore; }
        
        public int getTotalQuestions() { return totalQuestions; }
        public void setTotalQuestions(int totalQuestions) { this.totalQuestions = totalQuestions; }
        
        public int getGradedQuestions() { return gradedQuestions; }
        public void setGradedQuestions(int gradedQuestions) { this.gradedQuestions = gradedQuestions; }
        
        public String getGradeStatus() { return gradeStatus; }
        public void setGradeStatus(String gradeStatus) { this.gradeStatus = gradeStatus; }
    }
} 